package com.huse.blog.handler;

/**
 * @author llb
 * @version 1.0
 * @description: TODO
 * @date 2024/2/25 1:02
 */
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;


@ControllerAdvice
public class ControllerExceptionHandler {

    //记录日志  先拿到日志对象
    private final Logger logger = LoggerFactory.getLogger(ControllerExceptionHandler.class);
    /**
     * 异常处理
     * @param request
     * @param e
     * @return
     */
    @ExceptionHandler({Exception.class})//表示这个方法可以做异常处理的
    public ModelAndView handleException(HttpServletRequest request, Exception e) throws Exception {

        //访问路径出错时  通过request来获取
        logger.error("访问路径500出错  ==》 Request URL : {} , Exception : {}", request.getRequestURL(), e);

        //这样写是不对的，他会处理所有的异常，导致都会跳转到error.html里面
        // 需要判断当有一些注明状态异常码的 不需要处理 交给springboot来处理
        if (AnnotationUtils.findAnnotation(e.getClass(), ResponseStatus.class) != null) {
            throw e;
        }
        ModelAndView mav = new ModelAndView();
        mav.addObject("url", request.getRequestURL());
        mav.addObject("exception", e);
        mav.setViewName("error/error");

        return mav;
    }
}